package com.ljy.my_study.leetcode.复原IP地址;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author lijunying
 * @date 2021/11/15 16:20
 */
public class TestMain {

//    给定一个只包含数字的字符串 s ，用以表示一个 IP 地址，返回所有可能从 s 获得的 有效 IP 地址 。你可以按 任何 顺序返回答案。
//
//    有效 IP 地址 正好由四个整数（每个整数位于 0 到 255 之间组成，且不能含有前导 0），整数之间用 '.' 分隔。
//
//    例如："0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址，但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
//
//             
//
//    示例 1：
//
//    输入：s = "25525511135"
//    输出：["255.255.11.135","255.255.111.35"]
//    示例 2：
//
//    输入：s = "0000"
//    输出：["0.0.0.0"]
//    示例 3：
//
//    输入：s = "1111"
//    输出：["1.1.1.1"]
//    示例 4：
//
//    输入：s = "010010"
//    输出：["0.10.0.10","0.100.1.0"]
//    示例 5：
//
//    输入：s = "101023"
//    输出：["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
//             
//
//    提示：
//
//            0 <= s.length <= 3000
//    s 仅由数字组成
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode-cn.com/problems/restore-ip-addresses
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static void main(String[] args) {
        System.out.println(new TestMain().restoreIpAddresses("25525511135"));
    }

    public List<String> restoreIpAddresses(String s) {
        List<String> result=new ArrayList<>();
        if(s.length()<=12){
            int[] array={-1,-1,-1,-1};
            dfs(s,0,result,array,0);
        }
        return result;
    }

    public void dfs(String s,int start,List<String> result,int[] array,int level){
        int len=s.length();
        if(level==4){
            if(start==len){
                result.add(changeArray2Str(array));
            }
            return;
        }
        int num=0;
        for(int i=start;i<len;i++){
            if(s.charAt(start)=='0'&&i>start){
                return;
            }
            num=num*10+(s.charAt(i)-'0');
            if(num<0||num>255){
                return;
            }
            int[] newArray=Arrays.copyOf(array,4);
            newArray[level]=num;
            dfs(s,i+1,result,newArray,level+1);
        }
    }

    private String changeArray2Str(int[] array){
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<array.length;i++){
            sb.append(array[i]);
            if(i!=array.length-1){
                sb.append(".");
            }
        }
        return sb.toString();
    }
}
